package cn.zqy.demo2.day14FoundationStrengthening.reflect;

import cn.zqy.demo2.day14FoundationStrengthening.Domain.Person;

import java.lang.reflect.Field;

/**
 * 	* Class对象功能：
 * 		* 获取功能：
 * 			1. 获取成员变量们
 * 				* Field[] getFields() ：获取所有public修饰的成员变量
 * 				* Field getField(String name)   获取指定名称的 public修饰的成员变量
 *
 * 				* Field[] getDeclaredFields()  获取所有的成员变量，不考虑修饰符
 * 				* Field getDeclaredField(String name)
 * 			2. 获取构造方法们
 * 				* Constructor<?>[] getConstructors()
 * 				* Constructor<T> getConstructor(类<?>... parameterTypes)
 *
 * 				* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
 * 				* Constructor<?>[] getDeclaredConstructors()
 * 			3. 获取成员方法们：
 * 				* Method[] getMethods()
 * 				* Method getMethod(String name, 类<?>... parameterTypes)
 *
 * 				* Method[] getDeclaredMethods()
 * 				* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
 *
 * 			4. 获取全类名
 * 				* String getName()
 *
 *
 * 	* Field：成员变量
 * 		* 操作：
 * 			1. 设置值
 * 				* void set(Object obj, Object value)
 * 			2. 获取值
 * 				* get(Object obj)
 *
 * 			3. 忽略访问权限修饰符的安全检查
 * 				* setAccessible(true):暴力反射
 * */

public class Demo02ReflectField {
    public static void main(String[] args) throws Exception {
        //0.获取Person的Class对象
        Class personClass = Person.class;

        //1.Field[] getFields()获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field f : fields) {
        // public java.lang.String cn.zqy.demo2.day14FoundationStrengthening.Domain.Person.a
            System.out.println(f);
        }


        //2.Field getField(String name)
        Field field1 = personClass.getField("a");
        System.out.println(field1);

        // 【设置，获取值】
        Person p = new Person();
        // 1.获取成员变量a 的值
        System.out.println(field1.get(p));
        // 2.设置成员变量a 的值
        field1.set(p, "小米");
        System.out.println(field1.get(p));
        // Field field2 = personClass.getField("b");  //java.lang.NoSuchFieldException: b
        System.out.println("===========");


        // Field[] getDeclaredFields()：获取所有的成员变量，不考虑修饰符
        Field[] fields1 = personClass.getDeclaredFields();
        for (Field f : fields1) {
            System.out.println(f);
        }

        Field d1 = personClass.getDeclaredField("d");
        //忽略访问权限修饰符的安全检查  也称为：暴力反射
        d1.setAccessible(true);  // 不写这行直接获取会报错。
        Object d = d1.get(p);
        System.out.println(d);

        d1.set(p, "kkk");
        Object c = d1.get(p);
        System.out.println(c);
    }
}
